{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "阅读下面文章前，请保证[**zvt**](https://github.com/zvtvz/zvt)的环境已经准备好。\n",
    "\n",
    ">源码:  \n",
    ">https://github.com/zvtvz/zvt  \n",
    ">https://gitee.com/null_071_4607/zvt\n",
    "\n",
    ">文档:  \n",
    ">https://zvtvz.github.io/zvt/  \n",
    ">http://zvt.foolcage.com\n",
    "\n",
    "## 1. 什么是技术分析\n",
    "所谓技术分析，是以历史成交数据（量价）为基础的一种分析方法。  \n",
    "数据在时间上的排列，就有了图形(形态)。波浪，趋势，震荡，头肩顶，头肩底，压力线，支撑线等皆属此列。  \n",
    "而对数据进行各种维度的计算，便有了技术指标。ma,macd,kdj等皆属此列。  \n",
    "\n",
    "本质上，形态和指标并没有区别，都是对量价数据的一种计算，它是对真实的已经发生的买卖情况的不同角度的呈现.\n",
    "\n",
    "## 2. 技术分析有用吗？\n",
    "这个世界有很多不屑于技术分析而专注基本面的人，也有很多只看k线图而有意忽略其他因素的人，其中都有人能赚到钱，也有人亏损累累。  \n",
    "似乎，技术分析并不是那么必须。\n",
    "\n",
    "其实，从逻辑上，技术分析肯定是有用的。  \n",
    "因为，技术分析的因子里面最重要的就是价格，而连所谓价值投资派也必须重视价格。\n",
    "\n",
    "而往深层次看，已经发生的买卖情况很多时候有着明确的含义，比如高位的巨量顶分型往往是明确的上涨动力耗尽的信号。\n",
    "而清醒的投资者显然不能忽略这些信号。\n",
    "\n",
    "## 3. 经典论断\n",
    "技术分析的经典门派有道氏，艾略特波浪理论，江恩，k线形态等；其本质都是想从历史的成交数据中去寻找规律，其中夹杂着很多把或然当成必然的臆测，甚至缺少一个完整的成功率的统计，基本上都是朴素的经验主义，缺少逻辑上的严谨和统一。\n",
    "\n",
    "对此，缠中说禅曾经有过经典的论断：\n",
    "\n",
    ">现在，问题的关键变成，如何去寻找这三个互相独立的程序。首先，技术指标，都单纯涉及价量的输入而来，都不是独立的，只需要选择任意一个技术指标构成一个买卖程序就可以。对于水平高点的人来说，一个带均线和成交量的K线图，比任何技术指标都有意义。其次，任何一个股票都不是独立的，在整个股票市场中，处在一定的比价关系中，这个比价关系的变动，也可以构成一个买卖系统，这个买卖系统是和市场资金的流向相关的，一切与市场资金相关的系统，都不能与之独立；最后，可以选择基本面构成一个甄别“早泄”男程序，但这个基本面不是单纯指公司赢利之类的，像本ID在前几期所说，国航李总当兵出身不会让自己的股票长期跌破发行价这么没面子，还有认沽权证基本不会让兑现等等，这才是更重要的基本面，这需要对市场的参与者、对人性有更多的了解才可能精通。\n",
    "\n",
    ">技术分析，最核心的思想就是分类，这是几乎所有玩技术的人都搞不清楚的一点。技术指标发出买入信号，对于技术派来说，就以为是上帝给了暗示一般，抱着如此识见，几乎所有技术派都很难有大的成功。技术指标不过是把市场所有可能的走势进行一个完全的分类，为什么技术派事后都是高手，真正干起来就个个阳痿，就是这个原因。\n",
    "\n",
    ">对于水平高点的人来说，一个带均线和成交量的K线图，比任何技术指标都有意义。\n",
    "\n",
    ">有人可能要问，如果业绩突然不好或有什么坏消息怎么办？其实这种问题没什么意义，即使在成熟市场里，这类的影响都会事先反应在走势上，更不用说在中国社会里，什么消息可以没有任何人事先知道？你不知道不等于别人不知道，你没反应不等于别人没反应，而这一切，无论你知道与否，都必然会反应到走势上，等消息明朗，一切都晚了。走势是怎么出来的？是用钱堆出来的！在这资本的社会里，又有什么比用实在的钱堆出来的更可信？除了走势，又有什么是更值得相信的？而那些更值得相信的东西，又有哪样不是建筑在金钱之上的？资本市场就是一个金钱的游戏，除了钱，还是钱。只有钱是唯一值得信任的，而钱在市场上运动的轨迹，就是走势。这是市场中唯一可以观察与值得观察的东西。一切基本面、消息面等的分析，最终都要落实到走势上，要让实在的钱来说话，否则都是自渎而已。只要有钱的运动，就必然留下轨迹，必然在走势上反映出来。\n",
    "\n",
    "缠师这四段话明确了几点：\n",
    "* 技术分析是交易系统重要的一个部分，但不是全部\n",
    "* 好的技术分析是分类明确的评估系统，深陷进去是自找苦吃\n",
    "* 走势图有更深的含义\n",
    "\n",
    "## 4. 均线\n",
    "从不精确的角度，均线是所有技术分析里面最简单但也最实用的。\n",
    "甚至，技术分析有均线就够了。因为，技术分析只是一面，这一面无论你如何精确，都是不完美的，过于求精，反而可能一叶障目。\n",
    "\n",
    "那么均线的本质是什么？有什么必然的规律可循吗？\n",
    "\n",
    "先从均线的计算说起，其计算非常简单，就是一定时间窗口的收盘价的平均。\n",
    ">指数移动平均之类根据离目前时间间隔的不同采取不同的权重，一般越近权重越大，差别不大。\n",
    "\n",
    "本质上，均线代表着大部分人的持仓成本，从而有一定的压力或者支撑的作用，但也仅此而已，臆测更多并无意义。\n",
    "\n",
    "而所谓的规律，在人们眼中无非是\"如果发生什么，就会发生什么\"的一种\"必然性\"。\n",
    "\n",
    "所有的主观投资或者量化投资，都在试图寻找这种\"必然性\"，从而被这种“必然性”欺骗。\n",
    "\n",
    "如果真要说有什么必然性，那就是\"涨多了要跌\"，为什么不说“跌多了要涨”呢？因为很多品种是有可能归0的。\n",
    "\n",
    "## 5. 统计学\n",
    "在统计学已经神话到机器学习的今天，不搞点统计学好像就不科学了。\n",
    "\n",
    "人类的尊严似乎正在被机器夺去，投资似乎正越来越依赖机器。\n",
    "\n",
    "那么，在巨头们的巨大算力面前，普通人还有机会吗？\n",
    "\n",
    "似乎还是有的，现象上看：\n",
    "* 巴菲特之类的价值投资活得挺好\n",
    "* 量化投资的收益目前并没有证明比主观投资优秀\n",
    "* 机器学习+高频交易并不一定能给金融市场带来什么好处\n",
    "\n",
    "从逻辑上看：\n",
    "* 机器的算力优势是明显的\n",
    "* 机器+复杂模型的代价也是巨大的\n",
    "\n",
    "那么，普通人的机会在哪里？\n",
    "* 常识\n",
    "* 市场规则的理解\n",
    "* 简单的统计学和自动化\n",
    "\n",
    "前面两点先不说，为什么是简单的统计学呢？首先，简单意味着容易理解，容易执行，容易验证，并且不需要很大的算力，一般的电脑即可。\n",
    "在一定级别上，简单的统计学的力量并不比复杂的模型差。而自动化能够让人从枯燥无味的重复劳动中解放出来，从而专注一些更有用和有趣的方面。\n",
    "而这一切，只要设计合理，是可以靠一般的电脑完成的。\n",
    "\n",
    "## 6. 均线统计学\n",
    "\n",
    "算法：取5，10日均线，定义两种状态\n",
    "\n",
    "* 5日均线>10日均线(up)\n",
    "\n",
    "* 5日均线<=10日均线(down)\n",
    "\n",
    "当前持续该状态的次数记为current_count,并单独记录每轮持续的total_count;状态1用正数表示，状态2用负数.\n",
    "\n",
    "[具体实现代码](https://github.com/zvtvz/zvt/blob/master/zvt/factors/ma/ma_stats.py)\n",
    "\n",
    "[全市场每天持续运算](https://github.com/zvtvz/zvt/blob/master/zvt/factors/ma/ma_stats_runner1.py)\n",
    "\n",
    "运算后的数据如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from zvt.api import *\n",
    "from zvt.domain import *\n",
    "import plotly.express as px"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = get_data(Stock1dMaStateStats,provider='zvt',entity_id='stock_sz_000001')\n",
    "df[df.current_count>0].describe()\n",
    "df[df.current_count<0].describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这似乎不够直观，除了上下的次数差不多，看不出啥来，让我们用histogram来展示其分布:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "fig = px.histogram(df.loc[:,['total_count']],x='total_count')\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = get_data(Stock1dMaStateStats,provider='zvt',entity_id='stock_sz_000002')\n",
    "fig = px.histogram(df.loc[:,['total_count']],x='total_count')\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = get_data(Stock1dMaStateStats,provider='zvt',entity_id='stock_sz_300104')\n",
    "fig = px.histogram(df.loc[:,['total_count']],x='total_count')\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从中可以看出：\n",
    "* 无论是牛股还是垃圾股，up和down的次数和分布都是基本对称的\n",
    "* +-(1-10)占据了大部分的时间，其中+-(3-9)尤甚\n",
    "\n",
    "全市场的统计看一下（数据较大，导入需要比较长的时间）："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = get_data(Stock1dMaStateStats,provider='zvt')\n",
    "fig = px.histogram(df.loc[:,['total_count']],x='total_count')\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对称性更明显，+-(1-2)差不多，然后都是+-(3-5)递增，5之后逐步递减。而不管是个股，板块，全市场进行统计，都差不多。\n",
    "这说明了什么？对操作有什么帮助呢？\n",
    "这至少说明了：\n",
    "* 涨多了会跌，任何时候追涨都有极大的风险，特别是连涨(5-8)日后,变盘的概率太大了\n",
    "* 整体上，市场的涨跌是基本平衡的\n",
    "* 这种对称性及其变化说明，上涨，下跌，震荡(up和down的切换如果持续时间较短，一般就为震荡)是交替出现并有一定的周期性\n",
    "\n",
    "给操作的指导意义：\n",
    "* 没有什么股票是值得长期持有的，连续的上涨后，再好的股票也需要震荡来消化，而差的就可能永远回不去了\n",
    "\n",
    "现实的操作，显然知道这些是远远不够的，但连这些都不知道，那是肯定死都不知道怎么死的。\n",
    "\n",
    "看一看周线的情况如何："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "wk_df = get_data(Stock1wkMaStateStats,provider='zvt')\n",
    "fig = px.histogram(wk_df.loc[:,['total_count']],x='total_count')\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "周线上也呈现出这种一致性，可见“股价就是随机漫步”不过是如\"股市是赌场\"般的人云亦云的无知显摆。\n",
    "\n",
    "限定短一点的时间周期看一看："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "fig = px.histogram(wk_df[wk_df.timestamp>='2015-01-01'].loc[:,['total_count']],x='total_count')\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "fig = px.histogram(wk_df[wk_df.timestamp>='2019-01-01'].loc[:,['total_count']],x='total_count')\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "时间周期短一些后，这种对称性会有一定破坏，但以下几点依然有效\n",
    "\n",
    "* up和down的次数和分布都是基本对称的\n",
    "* +-(1-10)占据了大部分的时间，其中+-(3-9)尤甚"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 7. 小结\n",
    "\n",
    "以上，我们对技术分析和如何利用zvt来进行均线统计有了一个初步的认识，那么如何根据均线来选股并做相应的通知呢？我们下一节见。\n",
    "\n",
    "## 扩展问题\n",
    "* 如何对数字货币进行相应的统计？其有相似的规律吗？\n",
    "* 期货呢？\n",
    "提示：只需要理解zvt系统对entity的定义，在[MaStateStas](https://github.com/zvtvz/zvt/blob/master/zvt/factors/ma/ma_stats.py#L103:7)输入相应的entity类别即可。\n",
    "* 如何利用up,down两种状态的变化来定义趋势，震荡？并以此设计交易的策略来进行回测和交易。\n",
    "\n",
    "---\n",
    "**知乎专栏**:  \n",
    "https://zhuanlan.zhihu.com/automoney  \n",
    "\n",
    "**公众号**:  \n",
    "<img src=\"./imgs/gongzhonghao.jpg\" width=\"25%\" alt=\"公众号\">"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
